package cn.xeblog.plugin.game.game2048;

import cn.xeblog.commons.enums.Game;
import cn.xeblog.plugin.annotation.DoGame;
import cn.xeblog.plugin.game.AbstractGame;

import javax.swing.*;
import java.awt.*;

/**
 * 2048-游戏
 *
 * @author 浓睡不消残酒
 * @date 2022/8/11 15:11 PM
 */
@DoGame(Game.GAME_2048)
public class Game2048 extends AbstractGame {

  @Override
  protected void init() {
    // 初始化主面板
    super.initMainPanel();
    // 设置面板大小
    super.mainPanel.setMinimumSize(new Dimension(150, 200));

    // 加入开始页
    JPanel startPanel = new JPanel();
    startPanel.setBounds(10, 10, 120, 200);
    super.mainPanel.add(startPanel);

    // 加入标题
    JLabel title = new JLabel("2048小游戏");
    title.setFont(new Font("", 1, 14));
    startPanel.add(title);

    // 垂直
    Box vBox = Box.createVerticalBox();
    startPanel.add(vBox);
    vBox.add(Box.createVerticalStrut(5));

    // 将开始游戏和退出游戏按钮加入盒子
    vBox.add(getStartGameButton());
    vBox.add(getExitButton());

    // 刷新界面
    mainPanel.updateUI();
  }

  @Override
  protected void start() {
    // 初始化主面板
    super.initMainPanel();
    int width = 240;
    int height = 300;
    // 设置主面板宽度
    mainPanel.setMinimumSize(new Dimension(width + 10, height + 10));
    mainPanel.setLayout(new BorderLayout());
    mainPanel.add(Box.createVerticalStrut(10), BorderLayout.NORTH);

    // 中心面板
    GameUI gameUI = new GameUI();
    mainPanel.add(gameUI, BorderLayout.CENTER);

    // 添加返回游戏和退出游戏两个按钮
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(getBackGameButton());
    buttonPanel.add(getExitButton());

    // 添加按钮面板
    mainPanel.add(buttonPanel, BorderLayout.SOUTH);
    // 界面刷新
    mainPanel.updateUI();

    // 聚焦
    gameUI.requestFocusInWindow();
  }

  /**
   * 获取开始游戏按钮
   *
   * @return
   */
  private JButton getStartGameButton() {
    JButton button = new JButton("开始游戏");
    // 开始游戏监听事件
    button.addActionListener(e -> start());
    return button;
  }

  /**
   * 获取返回游戏按钮
   *
   * @return 返回游戏按钮
   */
  private JButton getBackGameButton() {
    JButton button = new JButton("返回游戏");
    // 返回游戏监听事件
    button.addActionListener(e -> init());
    return button;
  }

}
